from tqdm import tqdm
import os
import sys
from convert import convert
from concurrent.futures import ThreadPoolExecutor, as_completed
from shutil import copyfile

print(
    "===MarkThemDown===\n一个基于markitdown的转换器\n作者：Chal-Meng@outlook.com\n版本：1.0\n开源地址：gitee.com\\Chal-Meng\\markthemdown\n\n"
)


def get_directory() -> str:
    """获取当前文件或 exe 所在目录"""
    if getattr(sys, "frozen", False):  # 判断是否是打包后的环境
        executable_path = sys.executable  # 实际的 exe 路径
        directory = os.path.dirname(executable_path)  # 获取 exe 所在目录
    else:
        current_file = os.path.abspath(__file__)  # 当前脚本文件路径
        directory = os.path.dirname(current_file)  # 获取脚本所在目录
    return directory


# 获取命令行参数
if len(sys.argv) > 1:
    base_dir = sys.argv[1]
else:
    base_dir = get_directory()

base_dir = base_dir.strip("\\")
if not os.path.exists(base_dir):
    print(f"目录 {base_dir} 不存在，请检查后重新启动程序")
    os.system("pause")
    sys.exit(1)


def get_all_files_except_self(base_dir) -> list:
    """
    递归获取 base_dir 下的所有文件（包括子目录中的文件），
    排除当前运行的 Python 文件或 exe 所在目录中的自身。
    """

    current_file_path = os.path.abspath(
        sys.executable if getattr(sys, "frozen", False) else __file__
    )
    all_files = []
    for root, dirs, files in os.walk(base_dir):
        for file in files:
            file_path = os.path.join(root, file)
            # 排除自身
            if os.path.abspath(file_path) != os.path.abspath(current_file_path):
                all_files.append(file_path)
    print(f"当前目录：{base_dir}，共发现文件：{len(all_files)}个")
    return all_files


files = get_all_files_except_self(base_dir)
if not files:
    print("没有发现文件，请检查路径是否为",base_dir)
    os.system("pause")
    sys.exit(1)
t = tqdm(total=len(files))
results = []  # 收集返回值
with ThreadPoolExecutor(max_workers=200) as executor:
    futures = {
        executor.submit(convert, file_path, base_dir, t): file_path
        for file_path in files
    }
    for future in as_completed(futures):
        file_path = futures[future]
        results.append(future.result())

# 处理 results
error_files = []
copy_files = []
convert_files = []

for result in results:
    file_path, status = result
    if status == "error":
        error_files.append(file_path)
    elif status == "copy":
        copy_files.append(file_path)
    elif status == "convert":
        convert_files.append(file_path)
if error_files:
    # 输出 error 文件并复制到 \md转换失败 文件夹
    failure_dir = os.path.join(base_dir, "md转换失败")
    os.makedirs(failure_dir, exist_ok=True)

    print("转换失败的文件：")
    for error_file in error_files:
        print(error_file)
        try:
            copyfile(
                error_file, os.path.join(failure_dir, os.path.basename(error_file))
            )
        except Exception as e:
            print(f"复制失败: {error_file}, 错误信息: {e}")
if copy_files:
    print("以下文件转换格式不支持，已直接复制至目标文件夹：")
    for copy_file in copy_files:
        print(copy_file)

# 统计数量和百分比
total_files = len(results)
error_count = len(error_files)
copy_count = len(copy_files)
convert_count = len(convert_files)

print(f"\n统计结果：")
print(f"转换失败的文件数量: {error_count} ({(error_count / total_files * 100):.2f}%)")
print("对于转换失败的文件，您可以将此程序放到‘md转换失败’文件夹中再试一次，或手动转换")
print(f"直接复制的文件数量: {copy_count} ({(copy_count / total_files * 100):.2f}%)")
print(
    f"成功转换的文件数量: {convert_count} ({(convert_count / total_files * 100):.2f}%)"
)
try:
    os.startfile(base_dir + "-md")
except:
    pass
print(
    "感谢使用，欢迎到gitee.com\\Chal-Meng\\MarkThemDown给我的项目个小小的Star！现在您可以退出程序了"
)
os.system("pause")
